perm filename XIP1[DOC,BGB] blob sn#093418 filedate 1974-03-25 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00008 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	TITLE XIP - XEROX IMMEDIATE DOCUMENT PRINTER - BGB - 24 MARCH 1974.
 00005 00003	SAIL LIKE SUBROUTINE LINKAGE.
 00009 00004	START ADDRESS ENTRY.
 00010 00005	TEXT BUFFER SPECIFICATIONS.
 00012 00006	XGP RASTER SPECIFICATIONS.
 00015 00007	SUBR(XGPOUT)	OUTPUT BUFFER TO XGP FROM SECONDARY STORAGE.
 00017 00008	SUBR(PRINT)	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
 00022 ENDMK
⊗;
TITLE XIP - XEROX IMMEDIATE DOCUMENT PRINTER - BGB - 24 MARCH 1974.

;ALTERNATE PDP-10 MNEMONICS.
	OPDEF DIP[HRLM]↔OPDEF DAP[HRRM]
	OPDEF CAR[HLRZ]↔OPDEF CDR[HRRZ]
	OPDEF LAC[MOVE]↔OPDEF DAC[MOVEM]
	OPDEF DZM[SETZM]↔OPDEF GO[JRST]
	OPDEF FLOAT[FSC 233]↔OPDEF FIXX[FIX 233000]

;RETURN FROM AN N-ARGUMENT SUBROUTINE CALL.
	↓P←←17
	DEFINE POP0J<POPJ P,>
	↓POP1J.:↔SUB P,[2(2)]↔GO@2(P)↔DEFINE POP1J<GO POP1J.>
	↓POP2J.:↔SUB P,[3(3)]↔GO@3(P)↔DEFINE POP2J<GO POP2J.>
	↓POP3J.:↔SUB P,[4(4)]↔GO@4(P)↔DEFINE POP3J<GO POP3J.>
	↓POP4J.:↔SUB P,[5(5)]↔GO@5(P)↔DEFINE POP4J<GO POP4J.>

;ACCUMULATOR AND TEMPORARY DATA MANAGEMENT.
	DEFINE ACCUMULATORS(LIST){ACPTR←←2	;DECLARE ACCUMULATORS.
	FOR AC⊂(LIST)<AC←ACPTR↔ACPTR←←ACPTR+1↔>}
	FOR @$ I←0,16<AC.$I←I↔>		;ACCUMULATOR NAMES FOR RAID.
	DEFINE DECLARE (LIST){
	FOR VARNAM⊂(LIST)<VARNAM:0↔>}

;MACROS TO SAVE AND RESTORE AC'S  -  SAVAC, GETAC.
	DEFINE SAVAC $(N){LAC[XWD 2,[AC2: FOR I←2,N{0↔}]]↔BLT AC2+N-2}
	DEFINE GETAC (N){LAC[XWD AC2,2]↔BLT N}

;FATAL ERROR MESSAGE.
	DEFINE FATAL(STR){PUSHJ 17,FATAL.↔ASCIZ/STR/}
	FATAL.:OUTSTR[BYTE(7)15,12(21)"FAT"↔"AL - "⊗1↔0]
	OUTSTR @(17)↔INCHRW↔GO .-1↔LIT
	DEFINE CRLF{OUTSTR[BYTE(7)15,12]}
	%←←400000
;SAIL LIKE SUBROUTINE LINKAGE.
	DEFINE CAT $(A,B){A$B}	;CONCATENATION.
	.PLEVEL←←0	;PDL BACK POINTER.
	.SLEVEL←←0	;DEPTH OF NESTED SUBROUTINE DECLARATIONS.

;SUBROUTINE DECLARATION MACROS  -  SUBR & ENDR.
;(Reminder: Right-arrow, "→" is FAIL's macro arg EVAL).
	DEFINE SUBR(NAME,X1,X2,X3,X4,X5)↔{BEGIN NAME↔INTERN NAME
	GLOBAL .PLEVEL↔GLOBAL .SLEVEL↔.SLEVEL←←.SLEVEL+1
	CAT(.SBR,→.SLEVEL)←←.PLEVEL     ↔.PLEVEL←←.PLEVEL+1
	IFDIF<><X1>{DEFARG(X1,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
	IFDIF<><X2>{DEFARG(X2,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
	IFDIF<><X3>{DEFARG(X3,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
	IFDIF<><X4>{DEFARG(X4,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1
	IFDIF<><X5>{DEFARG(X5,→.PLEVEL) ↔.PLEVEL←←.PLEVEL+1}}}}}
	XWD 777000+.PLEVEL-CAT(.SBR,→.SLEVEL)-1,[SIXBIT|NAME|]
	↓NAME:;}

;DEFINE ARGUMENT NAME MACRO.
	DEFINE DEFARG(NAME,LEVEL){DEFINE NAME{LEVEL-.PLEVEL(17)}}
;SUBROUTINE TERMINATION MACRO.
	DEFINE ENDR{.PLEVEL←←CAT(.SBR,→.SLEVEL)
	.SLEVEL←←.SLEVEL-1↔LIT↔BLOCK 0↔BEND }

;SUBROUTINE CALLING MACROS  -  CALL & SETQ.
	DEFINE CALL(NAME,X1,X2,X3,X4,X5)
	{GLOBAL .SLEVEL,.PLEVEL↔.SLEVEL←←.SLEVEL+1
	CAT(.SBR,→.SLEVEL)←←.PLEVEL
	IFDIF<><X1>{PUSH P,X1↔.PLEVEL←.PLEVEL+1
	IFDIF<><X2>{PUSH P,X2↔.PLEVEL←.PLEVEL+1
	IFDIF<><X3>{PUSH P,X3↔.PLEVEL←.PLEVEL+1
	IFDIF<><X4>{PUSH P,X4↔.PLEVEL←.PLEVEL+1
	IFDIF<><X5>{PUSH P,X5↔.PLEVEL←.PLEVEL+1 }}}}}
	IFDIF<><NAME>{PUSHJ P,NAME }
	.PLEVEL←←CAT(.SBR,→.SLEVEL)↔.SLEVEL←←.SLEVEL-1}
	DEFINE SETQ(VAR,LIST){CALL(LIST)↔DAC 1,VAR}

;STACK ACCESSING MACROS  -  PUSHP & POPP.
	DEFINE PUSHP(ARG){PUSH P,ARG↔.PLEVEL←←.PLEVEL+1}
	DEFINE POPP(ARG) {POP  P,ARG↔.PLEVEL←←.PLEVEL-1}
;START ADDRESS ENTRY.
;--------------------------------------------------------------------
PDL:	BLOCK 100
SA:	CALLI
	LAC P,[IOWD 100,PDL]
	CALL(MKXBUF)		;MAKE XGP BUFFER,
	CALL(COMSCAN)		;COMMAND LINE SCAN.

	OUTSTR[ASCIZ/
	END OF COMMAND LINE.
/]↔	INCHRW↔GO .-1

	CALL(XGPOUT)
	EXIT
;--------------------------------------------------------------------
;TEXT BUFFER SPECIFICATIONS.

	CHRCNT:	0	;NUMBER OF CHARACTERS REMAINING.
	TXTPTR:	0	;CURRENT TEXT POINTER.
	TXTORG:	0	;ORIGIN OF TEXT BUFFER.
	TXTEND:	0	;END OF TEXT BUFFER.

SUBR(COMSCAN)	;COMMAND LINE SCAN.
COMMENT .-----------------------------------------------------------.
;RESCAN COMMAND LINE FOR CHARACTERS RIGHT OF SEMI-COLON.
	RESCAN↔INCHSL↔EXIT		;READ CHARACTER LEFT OF SEMICOLON.
	CAIN 15↔EXIT			;EXIT NO SEMICOLON.
	CAIE";"↔GO .-5↔DZM CHRCNT
	CDR JOBFF↔HRLI 440700		;TEXT BUFFER POINTERS.
	DAC TXTPTR↔DAC TXTORG
	INCHSL 1↔EXIT			;READ FIRST CHARACTER.
	DZM BUGFLG#↔CAIN 1,"!"		;"!" FORCES WAIT AFTER RESCAN.
	SETOM BUGFLG↔GO .+3
	INCHSL 1↔GO .+4↔AOS CHRCNT	;READ REMAINING CHARACTERS.
	IDPB 1,0↔GO .-4↔DAC TXTEND
	SKIPN BUGFLG↔POP0J
	OUTSTR[ASCIZ/BEGIN./]		;WAIT FOR DEBUGGER.
	INCHRW↔CRLF↔POP0J
ENDR COMSCAN;3/25/74(BGB)--------------------------------------------
;XGP RASTER SPECIFICATIONS.

;XGP RASTER PAGE BUFFER.
	ORGXGP:0	;XGP BUFFER IN CORE.
	ENDXGP:0

;XGP RASTER DIMENSIONS.
	WWIDTH←←=36		;WORD WIDTH OF A ROW.
	NCOLS←←(WWIDTH-1)*=36	;NUMBER OF COLUMNS	IS 1260.
	MROWS←←=1800		;NUMBER OF ROWS		IS 1800.
	BUFSIZ←←WWIDTH*MROWS

	ROW:0		;XGP "PEN" POSITION.
	COL:0
	DROW:0		;DELTA PEN POSITION FOR LINE FEED AND SPACE.
	DCOL:0	

SUBR(MKXBUF)	;MAKE XGP PAGE BUFFER.
COMMENT .-----------------------------------------------------------.
	CDR JOBFF↑↔ADDI 10↔DAC ORGXGP
	ADDI BUFSIZ-1↔DAC ENDXGP↔ADDI 10
	CORE↔GO[FATAL(CAN'T GET CORE FOR XGP BUFFER.)]
	LAC 1,ORGXGP↔SETZM(1)
	DIP 1,1↔AOS 1↔BLT 1,@JOBREL↑
	POP0J
ENDR MKXBUF;3/24/74(BGB)---------------------------------------------

SUBR(MKFRAM)		;MARKS BORDER OF XGP BUFFER ON PAGE.
COMMENT .-----------------------------------------------------------.
	SETO
	LAC 1,ORGXGP↔MOVEI 2,MROWS
L1:	DPB 0,[POINT 9,1(1),8]
	DPB 0,[POINT 9,=35(1),35]
	ADDI 1,WWIDTH↔SOJG 2,L1
	MOVSI 1,-9*=36
	HRR 1,ORGXGP
	SETOM (1)
	SETOM =91*=36(1)
	SETOM =1791*=36(1)
	AOBJN 1,.-3
	POP0J
ENDR MKFRAM;---------------------------------------------------------
SUBR(XGPOUT)	OUTPUT BUFFER TO XGP FROM SECONDARY STORAGE.
COMMENT .-----------------------------------------------------------.

;PUT XGP CONTROL WORD IN EACH ROW.

	LAC 0,[1B11+=250B23+WWIDTH-1]		;COLUMN ZERO POSITION.
	LAC 1,ORGXGP↔MOVEI 2,MROWS
	DAC 0,(1)↔ADDI 1,WWIDTH↔SOJG 2,.-2
	MOVSI -BUFSIZ-5				;2+BUFSIZ+3
	HRR ORGXGP↔SUBI 3
	DAC DUMARG				;DUMP ARGUMENT.

;SETUP END CUTS AND SPACES.
	LAC 1,ORGXGP↔SUBI 1,3
	PUSH 1,[1B0]		;CUT AT TOP OF PAGE.
	PUSH 1,[=150B11]	;3/4" MARGIN SPACE AT TOP OF PAGE.
	LAC 1,ENDXGP
	PUSH 1,[=250B11]	;5/4" MARGIN SPACE AT BOTTOM OF PAGE.
	PUSH 1,[1B0]		;CUT AT THE BOTTOM OF PAGE.
	PUSH 1,[0]		;LAST WORD OF XGP BUFFER.

;PRINT A PAGE ON THE XGP.
	INIT 2,17↔SIXBIT/XGP/↔0↔GO[
	  OUTSTR[ASCIZ/XGP INIT FAILED.
/]↔	  POP0J]↔LOCK
	OUTSTR[ASCIZ/PAGE TO XGP.../]
	OUT 2,DUMARG
	UNLOCK
	RELEASE 2,
	OUTSTR[ASCIZ/FINISHED.
/]↔	POP0J
	DUMARG:	0↔0
ENDR XGPOUT;3/24/74(BGB)------------------------------------------
SUBR(PRINT)	PLACE A GLYPH INTO XGP BUFFER AT ROW,COL.
COMMENT .-----------------------------------------------------------.
;Implicit Arguments to PRINT are ROW, COL, CHAR,
;FONT, FONTAB, ORGXGP, ENDXGP, TJMODE.
	ACCUMULATORS{G,B,B2,M,N,I,X16}
	SKIPN CHAR↔POP0J	;IGNORE NULL CHARACTERS.
	LAC 1,FONT		;CURRENT FONT NUMBER.
	SKIPN 2,FONTAB(1)↔POP0J	;FONT BASE ADDRESS.
	LAC I,203(2)		;ROWS BETWEEN TOP AND BASE LINE.
	ADD 2,CHAR		;POINTER INTO FONT'S CHARACTER TABLE.
	CAR N,(2)		;COLS WIDE OF THE GLYPH.
	CDR G,(2)↔SKIPN G↔POP0J ;EXIT WHEN NO CHARACTER.
	ADD G,FONTAB(1)↔AOS G	;CHARACTER'S GLYPH POINTER.
	CDR M,(G)		;ROWS HIGH OF THE GLYPH.
	CAR 0,(G)		;ROWS FROM TOP TO FIRST ROW OF GLYPH.
	SUB 0,I			;ROWS ABOVE CURRENT XGP PEN POSITION.
	ADD 0,ROW↔SUB 0,QLO
	IMULI WWIDTH
	ADD ORGXGP↔DAPZ B	;WORD POINTER INTO XGP BUFFER.
	LAC 0,COL
	SKIPE TJMODE↔GO .+3	;CLIP LINE OVERFLOW IF TJMODE=0
	CAML 0,RMAR↔POP0J
	IDIVI 0,=36		;REMAINDER IN AC-1 !
	AOS↔ADD B,0↔DAC B,B2	;WORD POINTER INTO XGP BUFFER.
 	ADDM N,COL		;UPDATE XGP PEN COLUMN POSITION.
	TLO G,444400↔AOS G	;SETUP GLYPH BYTE POINTER.
	CAILE N,=36↔GO[
	IDIVI N,=36↔AOJA N,L0]	;WHEN CHARACTER WIDTH ≥ =36.
	DPB N,[POINT 6,G,11]	;SIZE OF BYTE.
	ADD 1,N↔SUBI 1,=36	; =36 - CHRWID - REMAINDER
	LACI N,1
L0:	MOVNS 1↔DAP 1,L3	;BYTE POSITION WITH RESPECT TO WORD BOUNDARYS.

;INCLUSIVE OR GLYPH BITS INTO THE XGP BUFFER.

L1:	LAC I,N
L2:	ILDB 0,G↔SETZ 1,
L3:	LSHC 0,0
	CAML B,ORGXGP↔CAMLE B,ENDXGP↔SKIPA↔IORM 0,(B)
	AOS B↔JUMPE 1,L4
	CAML B,ORGXGP↔CAMLE B,ENDXGP↔SKIPA↔IORM 1,(B)
L4:	SOJG I,L2↔LAC B,B2
	ADDI B,WWIDTH↔DAC B,B2
	SOJG M,L1
	POP0J
ENDR PRINT;5/23/73(BGB)----------------------------------------------
END SA